home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / rsynth / src / getarg.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  3.3 KB  |  142 lines

  1. #if defined(__STDC__)
  2. #include <stdarg.h>
  3. #else
  4. #include <varargs.h>
  5. #endif
  6.  
  7. #include <stdio.h>
  8. #include <ctype.h>
  9. #include <string.h>
  10. #include "proto.h"
  11. #include "getargs.h"
  12.  
  13. /*
  14.   Usage is like :
  15.  
  16.      argc = getargs(argc,argv,
  17.                     "r", "%d", &rate,               Integer
  18.                     "u", "",   &ufile_name,         String
  19.                     "g", "%d", &gain,               Double
  20.                     "a", NULL, &use_audio,          Boolean -a toggles, +a sets
  21.                     "s", ""  , &speaker,            Booelan -s clears, +s sets
  22.                     NULL);
  23.  
  24. */
  25.  
  26.  
  27. #if defined(__STDC__)
  28. int getargs(int argc,char *argv[],...)
  29. #else
  30. int getargs(argc,argv,va_alist)
  31. int argc;
  32. char *argv[];
  33. va_dcl
  34. #endif
  35. {va_list ap;
  36.  int i = 0;
  37.  while (i < argc)
  38.   {
  39.    char *s = argv[i];
  40.    int flag = *s++;
  41.    if (flag == '-' || flag == '+')
  42.     {
  43.      int off = 1;
  44.      while (*s)
  45.       {char *a;
  46.        int  count = 0;
  47. #if defined(__STDC__)
  48.        va_start(ap,argv);
  49. #else
  50.        va_start(ap);
  51. #endif
  52.        while ((a = va_arg(ap,char *)))
  53.         {int l = strlen(a);
  54.          char *fmt = va_arg(ap,char *);
  55.          void *var = va_arg(ap,void *);
  56.          if (l > 1)
  57.           {
  58.            if (!count && !strcmp(s,a))
  59.             {
  60.              if (fmt)
  61.               {
  62.                if (i + off < argc)
  63.                 {char *x = argv[i + off++];
  64.                  if (strchr(fmt,'%'))
  65.                   {
  66.                    if (sscanf(x,fmt,var) != 1)
  67.                     fprintf(stderr,"%s : %s invalid after -%s\n",argv[0],x,a);
  68.                   }
  69.                  else
  70.                   *((char **) var) = x;
  71.                 }
  72.                else
  73.                 fprintf(stderr,"%s : no argument after -%s\n",argv[0],a);
  74.               }
  75.              else
  76.               {
  77.                if (flag == '+')
  78.                 *((int *) var) = !0;
  79.                else
  80.                 *((int *) var) = !*((int *) var);
  81.               }
  82.              /* skip to end of string */
  83.              count++;
  84.              s += l;
  85.              break; /* out of va_arg loop */
  86.             }
  87.           }
  88.          else
  89.           {
  90.            if (*s == *a)
  91.             {
  92.              if (fmt)
  93.               {
  94.                if (i + off < argc)
  95.                 {char *x = argv[i + off++];
  96.                  if (strchr(fmt,'%'))
  97.                   {
  98.                    if (sscanf(x,fmt,var) != 1)
  99.                     fprintf(stderr,"%s : %s invalid after -%s\n",argv[0],x,a);
  100.                   }
  101.                  else
  102.                   *((char **) var) = x;
  103.                 }
  104.                else
  105.                 fprintf(stderr,"%s : no argument after -%s\n",argv[0],a);
  106.               }
  107.              else
  108.               {
  109.                if (fmt || flag == '+')
  110.                 *((int *) var) = (flag == '+');
  111.                else
  112.                 *((int *) var) = !*((int *) var);
  113.               }
  114.              count++;
  115.              s++;
  116.              break; /* out of va_arg loop */
  117.             }
  118.           }
  119.         }
  120.        va_end(ap);
  121.        if (!count)
  122.         {
  123.          off = 0;
  124.          break;   /* Out of s loop */
  125.         }
  126.       }
  127.      if (off != 0)
  128.       {
  129.        int j;
  130.        argc -= off;
  131.        for (j = i; j <= argc; j++)
  132.         argv[j] = argv[j + off];
  133.       }
  134.      else
  135.       i++;
  136.     }
  137.    else
  138.     i++;
  139.   }
  140.  return argc;
  141. }
  142.